package org.design.strategyPattern;

import org.design.sort.DataUtils;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * StrategyPattern
 * 策略模式
 * 在策略模式（Strategy Pattern）中一个类的行为或其算法可以在运行时更改。
 * 这种类型的设计模式属于行为型模式。
 * 在策略模式定义了一系列算法或策略，并将每个算法封装在独立的类中，使得它们可以互相替换。
 * 通过使用策略模式，可以在运行时根据需要选择不同的算法，而不需要修改客户端代码。
 * 在策略模式中，我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。
 * 策略对象改变 context 对象的执行算法。
 *
 * @author 樊温军
 * @date 2025/6/24 上午10:31
 */
public class StrategyPattern {
    List<Integer> arr = new ArrayList<>() {
        {
            add(6);
            add(0);
            add(3);
            add(1);
            add(8);
        }
    };

    private int size = 10000;

    @Test
    public void test() {
        long start = 0;
        long end = 0;

        // 创建策略对象—快速排序
        arr = DataUtils.getRandomList(size);
        start = System.currentTimeMillis();
        AlgorithmContext quickSort = new AlgorithmContext(new QuickSortAlgorithm());
        quickSort.sort(arr);
        end = System.currentTimeMillis();
        System.out.println("快速排序耗时：" + (end - start) + "ms");

        // 创建策略对象—希尔排序
        arr = DataUtils.getRandomList(size);
        start = System.currentTimeMillis();
        AlgorithmContext shellSort = new AlgorithmContext(new ShellSortAlgorithm());
        shellSort.sort(arr);
        end = System.currentTimeMillis();
        System.out.println("希尔排序耗时：" + (end - start) + "ms");

        // 创建策略对象—归并排序
        arr = DataUtils.getRandomList(size);
        start = System.currentTimeMillis();
        AlgorithmContext mergeSort = new AlgorithmContext(new MergeSortAlgorithm());
        mergeSort.sort(arr);
        end = System.currentTimeMillis();
        System.out.println("归并排序耗时：" + (end - start) + "ms");

        // 创建策略对象—插入排序
        arr = DataUtils.getRandomList(size);
        start = System.currentTimeMillis();
        AlgorithmContext insertionSort = new AlgorithmContext(new InsertionSortAlgorithm());
        insertionSort.sort(arr);
        end = System.currentTimeMillis();
        System.out.println("插入排序耗时：" + (end - start) + "ms");
    }

}
